{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Set\n",
    "----"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Xem thêm về [Set](https://www.tutorialspoint.com/python/python_sets.htm)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://lh3.googleusercontent.com/NZlbtOuh5f3gSVLkJwD7waPQ7FrI_O91DRZsU7oSkt1YL-eENHVpM688S7IR2vXQAAMxPQ6I0RpsQPCfIcwIiOP3ynrPd29wl_wu4ldXJFTgbq00OxC-FA8HNeJ4Ughp32aGgIu03V1K4crVHF-DR6THuMHCvoo_sbbcCGA2IYRscOxW3jtUDxpAJLwlwly9qY7GX59meaeHOb3stvQo30Jx4gfxtHNBcE5-7fqd6DOKUHieoy6I4cyb7OpJzSySwDlts2-J1NgNQKtkqileuKOJCFzJY3gA-1JGFOgY5UU8XnPZ36yelqJ7I__PbzCZVDaxuhU5yqE-VJD3kHwr4UD13UMBBYjU53MtKwgdvSsA-9ff2gnJoL87XmgiUEYR_N9j91W-NZUy09BEQOxgt32BLqK-xdnyTGcq4OqZnJlZCnYYjxBg_mMV11BwtqOwr2Yj6p4mr305pnR28B0vrUDAfPoLz-zMe5CeEHx-A_FkEVyz6zCczEAnGtkYDT1UXXZ9MeN1b_sMz1fQw3jR5gpI-3Y53rmpkSr1TXkcjz0GwctxjauRdCQ3say_BNRJScRQpvJpEvCVMHSUEOaLg9yDEOSLjRuT4R7rPMXuBS25KPDgrenM-J6Ahbfe5PxWYoew22tVnLmK6H6ymv1XGagsccnHZO9Vyw=w737-h839-no)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Set trong Tiếng Việt Toán học có thể dịch ra là Tập hợp với các tính chất\n",
    "    - Tập hợp các phần tử sắp xếp không có thứ tự\n",
    "    - Mỗi phần tử là độc nhất (Unique) và phải là bất biến(immutable) \n",
    "    - Trái lại bản thân Set là khả biến(mutable), chúng ta có thể thêm, xóa phần tử của Set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### I. Khởi tạo một Set"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1. Cách 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set chỉ chứa số\n",
    "number_set = { 1, 2, 4, 5, 6, 8, 10 }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Set chứa nhiều kiểu dữ liệu khác nhau\n",
    "mix_set = { \"Ngoc\", 34, (4, 5, 6) }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Nhưng các kiểu dữ liệu này phải bất biến như Integer, Float, Boolean hay Tuple"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "unhashable type: 'list'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-78-0c98884fe61c>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m      1\u001b[0m \u001b[1;31m# Python sẽ báo lỗi nếu bạn đặt một biến khả biến trong Set\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m      2\u001b[0m \u001b[1;31m# trường hợp tôi đặt một list trong Set\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mmix_mutable_set\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m{\u001b[0m \u001b[1;34m\"Elon Musk\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m\"Sunda Pichai\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m4\u001b[0m \u001b[1;33m]\u001b[0m \u001b[1;33m}\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mTypeError\u001b[0m: unhashable type: 'list'"
     ]
    }
   ],
   "source": [
    "# Python sẽ báo lỗi nếu bạn đặt một biến khả biến trong Set\n",
    "# trường hợp tôi đặt một list trong Set\n",
    "mix_mutable_set = { \"Elon Musk\", \"Sunda Pichai\", [ 2, 4 ] }"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2. Cách 2\n",
    "Tạo một empty set và thêm phần tử vào set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {},
   "outputs": [],
   "source": [
    "foods = set()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {},
   "outputs": [],
   "source": [
    "foods.add(\"Toast\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Toast'}"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "foods"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [],
   "source": [
    "apple = set(\"apple\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'a', 'e', 'l', 'p'}"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "apple"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Chú ý:** Chúng ta không thể tạo một set rỗng bằng ngoặc kép - {}, Python mặc định hiểu đây là dictionary"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### II. Các phương thức"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 1. add()\n",
    "Thêm một phần tử vào Set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {},
   "outputs": [],
   "source": [
    "breakfast = { \"eggs\", \"bacon\", \"sausage\", \"toast\", \"cereal\", \"milk\", \"muffin\" }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {},
   "outputs": [],
   "source": [
    "breakfast.add(\"coffee\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bacon', 'cereal', 'coffee', 'eggs', 'milk', 'muffin', 'sausage', 'toast'}"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "breakfast"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 2. remove()\n",
    "Xóa một phần tử khỏi Set\n",
    "    - Throw error nếu phần tử không tồn tại trong Set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {},
   "outputs": [],
   "source": [
    "breakfast = { \"eggs\", \"bacon\", \"sausage\", \"toast\", \"cereal\", \"milk\", \"muffin\" }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [],
   "source": [
    "breakfast.remove(\"sausage\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'bacon', 'cereal', 'eggs', 'milk', 'muffin', 'toast'}"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "breakfast"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "ename": "KeyError",
     "evalue": "'pho'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m                                  Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-88-214c86854fbf>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mbreakfast\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mremove\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"pho\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mKeyError\u001b[0m: 'pho'"
     ]
    }
   ],
   "source": [
    "breakfast.remove(\"pho\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 3. discard()\n",
    "Xóa phần tử khỏi Set\n",
    "    - Không throw error nếu phần tử không tồn tại trong Set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "breakfast = { \"eggs\", \"bacon\", \"sausage\", \"toast\", \"cereal\", \"milk\", \"muffin\" }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "breakfast.discard(\"bacon\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'cereal', 'eggs', 'milk', 'muffin', 'sausage', 'toast'}"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "breakfast"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 4. union()\n",
    "Trả về hợp hai tập hợp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://lh3.googleusercontent.com/dWdyQ-OePXMjAv5RKyQpXYDDR62R8jnhw13aAn-PCMjN-jNqHhyFlydE7xM2LjZ_AUfnoiwzUOwcrSmyf3GzV7ZRUPGf0Bt7NskStzmfadzhbOSRhNAaahxwf0V4wJasO7bFkwDU3eA3kARl-6CYmKTKZ9EXD5yNeZI3B44Bnfo050QObemD3n_H0U-zkDzZFk6pcTBHN-nqak56r0UajhwhEwR6YuI5k3ejf-gfB-PAEgW2z6eoAaykRSuA79-FHdry1ZT6orIH252JtEvDZUt_tkobViyvl4x93oY5LNUHIxrBnPFrsVL2w2McGXOAOFvdv-E4N1GvkCjCMe1L4FUkmUzEbdLeN2Jj9cz1rwknD8XtUIxK3DZep26c4pSjEMuyowLGJ0o3OiNYtbg1Ntp-9qrv8f6hJ9bzkDdkW5w6rK7QPfDTngvr0izaIb9TJDas14ypGglbu-bOKj2Boohhdyr0U3_l9a6BehDmy22lLq4vezZyT1UUtXK0EHAtslxVkgPcAzQsHmNEfJn0-zwtkIGLP3vSn-qIsLdMLuoW8pru419nIwQx1jeiWCrC-rYX-aViGq0oS57nqbdnBWTzwLlTPJ8WGTWzg2UtkXhANz8gz2ysnPjYZO-lQBEOs7vH6jYoOL0Xe1mtnNKAg3tkIQmLsfXxeg=w450-h264-no)\n",
    "\n",
    "Ảnh từ [Python Sets](https://www.programiz.com/python-programming/set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cho A và B là các tập hợp, khi đó hợp của A và B là tập gồm các phần tử A và các phần tử của B, và không chứa phần tử nào khác. Hợp của A và B được viết là \"A ∪ B\". Theo [Wiki](https://vi.wikipedia.org/wiki/Ph%C3%A9p_h%E1%BB%A3p)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = { 1, 2, 3}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "B = { 2, 3, 4 }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1, 2, 3, 4}"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.union(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1, 2, 3, 4}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.union(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{1, 2, 3, 4}"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Tương đương với\n",
    "A | B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 5. intersection()\n",
    "Trả về giao 2 tập hợp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://lh3.googleusercontent.com/g3TC_BF1ubEiGGOn9EyYepHxxI_o79IwFKwUKr8EUFhnUCrBRxWhfJWfwuz8zzmWfj9xSZ_SaohOBBQsLH5dckPT0YdX2XkbPPS2s8uTRIomqtr3BKBfmEA7RVSEs02lmf9rjWgPb2oyfLgMam72XSJWb3yq8sXy3INZt11AzrNjoN7SyNVmSa4QNBR6B45bro9oU97g_J7yi5SK2Ktwonx3jzO7lFViWVnPyQLfE-gGVu8WyPhBRhz9lBT1FyKYUWAOwkPFS7b6-dpnMRsQ6WNhsyZXgU6kVgI9mt0li1nUZJNjFthWRxbC-JRe1g5zeAhGWyvYyfgegwWohAtaYzccrHmLUjQx-O97PywUwborVgT5b_05ycxnP8t0nRjWZvfQa0pUBi8fGkgFfnbWpvLaiP3wCSDHYVrX8go_s_bOmZG6YzcoS2Rd75eKAz4ukrctFEHc8Z62wtCTHVWHprQqFXLpUGZpOPKMcZ6rYrp-0TssEhhK2OZhvP7Cv0WkvVWlo6w_qwcYx5NmsccYXT6J-rT3PgkIdnNUk26x42YV0LQxAdFN4b8Lm3bvHiELgyycyKOkVDQ9HAZx4C5qLnzCsekPEynsHhtASmkgb1NEQ21EcuKNPU9ygXt6S7JM9YoQooVTiCz_96ImNDcfhHj5gYoNUVddOg=w450-h262-no)\n",
    "\n",
    "Ảnh từ [Python Sets](https://www.programiz.com/python-programming/set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Cho A và B là hai tập hợp. Giao của A và B là tập gồm những phần tử thuộc cả A và B, ngoài ra không bao giờ có phần tử nào khác. Giao của A và B được viết là \"A ∩ B\". Theo [Wiki](https://vi.wikipedia.org/wiki/Ph%C3%A9p_giaop)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = { 9, 10, 12 }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "B = { 10, 12, 17 }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{10, 12}"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.intersection(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{10, 12}"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "B.intersection(A)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{10, 12}"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Tương đương với\n",
    "A & B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### 6. difference()\n",
    "Trả về hiệu 2 tập hợp"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](https://lh3.googleusercontent.com/pNBFcnLNuoQwWam_uo9WVA_gCcKw9j4Jc5wK-pwsqmdJmj0GyFKBNhT966M8f_T7T3oy1iKGIC80prF17_S2JkGe2mTphZVj7NYBVUR55_RrjzJxzFAVwSgvVASW6U3SjElV_BuKc9hAhta4V2muka36OXLYpy6226rFaZuQvyjnv2k2BLNdFa9E5rt4hjd-IFJ4BiHntWd9CihK-jc_0BCRPgr7BGU7843E5eeQFY1wQRfa1p6niRFxb692bd6vd5JK4BPNcM_XZkHFNseEIimEmv_spu3dla9YJqczlGMFrTMM2Mgi7FWXhCz7lyRo_TRV7NzhIz6HsSvrIbkFVN2xdNK9-LMExUqRjv9t9KOeUgYQELxdGofbKa0kJF80vEhZUMXUTR5Ak03-JHMq1OU4pEmI8-9k9g--peRT0eIHfd9ALdtrPKh9v9vZyOhEAUe73pHv29GBXmlhKHBbNIvrkAppRCJ4nKOsKH2QyPxAj_PimxR6aA2ecs0TTMFGF465GA0tsJBkfPMrogNlgn-8iPAcqZ4K7YZHtoSqR-kmCNn0Ne_nstJd34C-qz0EEe8ADZ9QP1F4shvtxr22G94eG8BD6RWySEbh2FvWGcePEAmhLnxGYeBtzAner7Pdl7e7Zw_68Rrzje-PIjfybp63yn7QLpqJ7A=w450-h263-no)\n",
    "\n",
    "Ảnh từ [Python Sets](https://www.programiz.com/python-programming/set)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Hiệu của tập hợp A với tập hợp B, kí hiệu A - B là tập hợp gồm các phần tử thuộc A và không thuộc B"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = { \"My Tam\", \"Phuong Linh\", \"Ha Anh Tuan\" }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "B = { \"Erik\", \"Phuong Linh\", \"Ha Anh Tuan\" }"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'My Tam'}"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A.difference(B)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'My Tam'}"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# tương đương với\n",
    "A - B"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### III. Frozenset\n",
    "    - Nếu tuple là một immutable list thì frozenset là một immutable set. Ta không thể thêm xóa phần tử trong set "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [],
   "source": [
    "A = frozenset([1, 2, 3, 4])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {},
   "outputs": [
    {
     "ename": "AttributeError",
     "evalue": "'frozenset' object has no attribute 'add'",
     "output_type": "error",
     "traceback": [
      "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m                            Traceback (most recent call last)",
      "\u001b[1;32m<ipython-input-40-4582f3da6516>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mA\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0madd\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m\"10\"\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[1;31mAttributeError\u001b[0m: 'frozenset' object has no attribute 'add'"
     ]
    }
   ],
   "source": [
    "A.add(\"10\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 2",
   "language": "python",
   "name": "python2"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.14"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
